www.gusucode.com > C++ QQ农场源代码程序 > C++ QQ农场源代码程序/code/qq农场源代码/qq农场源代码/GETINFO.cpp
// GETINFO.cpp : implementation file // #include "stdafx.h" #include "SKSGODweb.h" #include "GETINFO.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////// #define QQ_HOST "http://happyfarm.xiaoyou.qq.com" //服务器地址 #define FirendInfo "/api.php?mod=friend&refresh=false" //得到好友列表 ///////////////////////////////////////////////////////////////////////////// // CGETINFO dialog #ifndef MAX_PACK #define MAX_PACK 256*1024 //数据包最大值 #endif //专用线程,刷新列表中的信息 UINT Tscaninfo(LPVOID lp); //商店里面所有东西 DONGXI dongxi[]= { {0, 0, 125, 10*60*60, 272, 15, "000"}, {0, 0, 125, 10*60*60, 272, 15, "萝卜"}, ////////////////////////////////////////////////////////////////////////// {1, 0, 125, 10*60*60, 272, 15, "白萝卜"}, {2, 0, 163, 13*60*60, 272, 18, "胡萝卜"}, {3, 3, 125, 14*60*60, 272, 19, "玉米"}, {4, 4, 125, 15*60*60, 272, 20, "土豆"}, {5, 5, 125, 16*60*60, 272, 20, "茄子"}, {6, 6, 125, 17*60*60, 272, 20, "番茄"}, {7, 7, 125, 18*60*60, 272, 20, "豌豆"}, {8, 8, 125, 20*60*60, 272, 20, "辣椒"}, {9, 9, 125, 22*60*60, 272, 20, "南瓜"}, {10, 10, 125, 21*60*60, 272, 20, "苹果"}, {11, 10, 605, 24*60*60, 272, 20, "草莓"}, {12, 11, 708, 28*60*60, 272, 20, "西瓜"}, {13, 12, 900, 31*60*60, 272, 20, "香蕉"}, {14, 13, 900, 42*60*60, 272, 20, "桃子"}, {15, 14, 900, 37*60*60, 272, 20, "橙子"}, {16, 15, 900, 46*60*60, 272, 20, "葡萄"}, {17, 16, 900, 52*60*60, 272, 20, "石榴"}, {18, 14, 900, 61*60*60, 272, 20, "柚子"}, {19, 18, 900, 64*60*60, 272, 20, "菠萝"}, {20, 19, 900, 55*60*60, 272, 20, "椰子"}, {21, 20, 900, 61*60*60, 272, 20, "葫芦"}, ////////////////////////////////////////////////////////////////////////// {22, 12, 900, 31*60*60, 272, 20, "完成了"}, {23, 12, 900, 31*60*60, 272, 20, "备用"}, }; //从一个字符中,开始点起,取出一个值 //找不到了返回0 //从特殊点开始搜索,结束点为: ","" int FindQQstr(CString str, CString csWillFind ,int nstart,CString &csRer) { int nStr=str.Find(csWillFind,nstart); int nEnd=0; // 所取位置结束点 if (nStr == -1) { // jein_outinfo("返回 0 ,没有找到:%s 开始点:%d ",csWillFind ,nstart); return 0; //不存这个值了 } else { int nEnd=-1; if (csWillFind == "money") //钱结束标志 }, { nEnd = str.Find("},", nStr ); } else { //{"userId":95105214,"userName":"\u738b\u56fd\u680b", nEnd = str.Find(",\"", nStr ); //取得结束点 } if (nEnd == -1) { jein_outinfo("结束点取得失败:%d",nEnd); return 0; } //开始点要 +2 //": nStr =nStr + csWillFind.GetLength() ; int nCount = nEnd - nStr; //要取得的字符数 csRer = str.Mid(nStr,nCount); ////////////////////////////////////////////////////////////////////////// csRer.Replace(":",""); csRer.Replace("\"",""); csRer.Replace("\\",""); return nEnd; //结束点 } return 0; } //#define CTRY_SYRIA 963 // Syria int UCSTo(wchar_t* pUCS,char *p,int codepage) //963 { int len = 0; if(pUCS == NULL || p == NULL) return -1; len = WideCharToMultiByte(codepage,0,pUCS,-1,NULL,0,NULL,NULL); WideCharToMultiByte(codepage,0,pUCS,-1,p,len,NULL,NULL); len--; return len; } ////////////////////////////////////////////////////////////////////////// //功能: 将 形如: \\u738b\\u56fd\\u680b 字符转为 char //instrname :传入 16 进制串即可, 可删除 \ u " void GetName(CString instrname,CHAR name[64]) { instrname.Replace("\\",""); instrname.Replace("u",""); instrname.Replace("\"",""); instrname.Replace(":",""); instrname.TrimLeft(); instrname.TrimRight(); int nlen = instrname.GetLength(); //得到字符长度 int nnamelen = nlen/4; //角色名长 if(nnamelen>8) { jein_outinfo("名字太长: %s",instrname); return ; } CString cs2wei; for (int i=0;i<nlen/2;i++) { cs2wei = instrname.Mid(i*2,2); //得到的二位 name[i]= strtol(cs2wei,0,16); } ////////////////////////////////////////////////////////////////////////// //移位转换 for (int j=0;j*2<nlen; j++) { int temp = name[2*j]; name[2*j]=name[2*j + 1]; name[2*j + 1] =temp; } ////////////////////////////////////////////////////////////////////////// char buftemp[64]; memset(buftemp,0,sizeof(buftemp)); UCSTo((wchar_t*)name,buftemp,936); ZeroMemory(name,sizeof(name)); strcpy(name,buftemp); //strncpy(name,buftemp,nlen/2); } CGETINFO::CGETINFO(CWnd* pParent /*=NULL*/) : CDialog(CGETINFO::IDD, pParent) { //{{AFX_DATA_INIT(CGETINFO) m_web = _T("http://happyfarm.xiaoyou.qq.com/api.php?mod=friend&refresh=false"); m_str_show = _T(""); //}}AFX_DATA_INIT } LRESULT CGETINFO::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class return CDialog::DefWindowProc(message, wParam, lParam); } BOOL CGETINFO::DestroyWindow() { return CDialog::DestroyWindow(); } void CGETINFO::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGETINFO) DDX_Control(pDX, IDC_LIST3_info_insert, m_ctrl_list); DDX_Control(pDX, IDC_LIST1, m_list); DDX_Text(pDX, IDC_EDIT2_WEB, m_web); DDX_Text(pDX, IDC_EDIT1_show, m_str_show); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CGETINFO, CDialog) //{{AFX_MSG_MAP(CGETINFO) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON10, OnButton10) ON_BN_CLICKED(IDC_BUTTON11, OnTestRead) ON_BN_CLICKED(IDC_BUTTON12, OnButton12) ON_NOTIFY(NM_CLICK, IDC_LIST3_info_insert, OnClickLIST3infoinsert) ON_BN_CLICKED(IDC_BUTTON2, OnOneInfo) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) //}}AFX_MSG_MAP END_MESSAGE_MAP() //先读取自己的好友列表,存放到玩家数组 //得到好友信息 BOOL CGETINFO::GetFriendInfo() { CString httpweb = (CString) QQ_HOST +(CString) FirendInfo; char *buf=new char[MAX_PACK]; if (buf == 0) { AfxMessageBox("申请指针失败"); return 0; } int ngetlen = jein_gethtml(httpweb,buf,MAX_PACK); jein_outinfo("得到好友信息长度:%d",ngetlen); if (strstr(buf,"errorType\":\"session")) { delete buf; AfxMessageBox("得到好友信息出错,检查是否已经登录,或者连接已超时"); return 0; } ////////////////////////////////////////////////////////////////////////// int nowrole=0; int nowoffset=1; //开始点 ////////////////////////////////////////////////////////////////////////// m_allnum=0; //初始化好友0 while(nowoffset) { CString struserid; CString strtemp; nowoffset = FindQQstr( buf,"userId",nowoffset,struserid); if (nowoffset == 0) { jein_outinfo("搜索完成"); break; } ////////////////////////////////////////////////////////////////////////// //再搜索名字显示 //"userName\":\"\u738b\u56fd\u680b\",\"headPic FindQQstr( buf,"userName",nowoffset,strtemp); char nametemp[64]; strtemp.Replace("u",""); GetName(strtemp, nametemp ); ////////////////////////////////////////////////////////////////////////// //钱 CString csmoney; FindQQstr(buf,"money",nowoffset,csmoney); ////////////////////////////////////////////////////////////////////////// //经验 CString csexp; FindQQstr(buf,"exp",nowoffset,csexp); ////////////////////////////////////////////////////////////////////////// //角色处理有点小bug CString csnamebug=nametemp; csnamebug.Replace("?",""); if (struserid.IsEmpty() && csnamebug.IsEmpty()) { jein_outinfo("名字与 ID 同为空"); continue; } ////////////////////////////////////////////////////////////////////////// //添加好友信息到总结构体中 strcpy(friendinfo[m_allnum].szuserid, struserid ); //角色 id friendinfo[m_allnum].userId = atoi(struserid); //角色ID strcpy(friendinfo[m_allnum].userName,csnamebug); //角色名 //nametemp friendinfo[m_allnum].exp = atoi(csexp); friendinfo[m_allnum].money =atoi(csmoney); ////////////////////////////////////////////////////////////////////////// //添加到控件 m_ctrl_list.InsertItem(m_allnum,""); m_ctrl_list.SetItemText(m_allnum,0, nametemp ); //名字 m_ctrl_list.SetItemText(m_allnum,1, struserid ); //ID m_ctrl_list.SetItemText(m_allnum,2,csmoney); //钱 m_ctrl_list.SetItemText(m_allnum,3,csexp); //经验 m_allnum++; //好友总数++ ////////////////////////////////////////////////////////////////////////// m_list.AddString((CString)strtemp); m_list.AddString((CString)nametemp); nowrole++; if (nowrole>500) break; } delete buf; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// return 1; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// void CGETINFO::OnButton1() { // GetFriendInfo(); } //得到一个URL内容 void CGETINFO::OnButton10() { UpdateData(); CString web= m_web; char *buf=new char[MAX_PACK]; if (buf == 0) { AfxMessageBox("申请指针失败"); return ; } jein_gethtml(web,buf,MAX_PACK); m_str_show= buf; delete buf; UpdateData(false); ////////////////////////////////////////////////////////////////////////// } // GET /api.php?mod=user&act=run&flag=1&ownerId=262807117 //得到一个id 的信息 void CGETINFO::GetRoleInfo(CString id) { CString path ="/api.php?mod=user&act=run&flag=1&ownerId="+id; path =(CString)QQ_HOST+path; jein_outinfo("请求地址好友地址: %s",path); char buf[64*1024]; jein_gethtml(path,buf,MAX_PACK); // } //初始化控件列表 void CGETINFO::InitTab() { static int is=1; int i=0; ListView_SetExtendedListViewStyle(m_ctrl_list.m_hWnd,LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT); if (is) { is=!is; m_ctrl_list.DeleteAllItems(); for (int i=0;i<8;i++) m_ctrl_list.DeleteColumn(0); m_ctrl_list.InsertColumn(i++,"姓名",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"ID",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"金钱",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"经验",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"0000000",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"000000",LVCFMT_LEFT,80); } else { is=!is; m_ctrl_list.DeleteAllItems(); for (int i=0;i<8;i++) m_ctrl_list.DeleteColumn(0); m_ctrl_list.InsertColumn(i++,"编号",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"名字",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"土地",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"作物",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"播种时间",LVCFMT_LEFT,120); m_ctrl_list.InsertColumn(i++,"状态",LVCFMT_LEFT,80); m_ctrl_list.InsertColumn(i++,"成熟时间",LVCFMT_LEFT,80); } } BOOL CGETINFO::OnInitDialog() { CDialog::OnInitDialog(); m_allnum = 0 ; //好友数量 InitTab(); GetFriendInfo(); //刷新好友列表 AfxBeginThread(Tscaninfo,this); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CGETINFO::OnTestRead() { } ////////////////////////////////////////////////////////////////////////// //植物的状态 struct WZT { int ztdj; char ztname[32]; }; WZT jeinzt[]= { {0, "成熟状态"}, {1, "未发芽"}, {2, "发芽 "}, {3, "小叶子"}, {4, "大叶子"}, {5, "开花"}, {6, "成熟"}, {7, "已经收获"}, }; ////////////////////////////////////////////////////////////////////////// void CGETINFO::OnClickLIST3infoinsert(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here int n =m_ctrl_list.GetNextItem(-1, LVIS_SELECTED); char bbbb[MAX_PATH]; m_ctrl_list.GetItemText(n,1,bbbb,MAX_PATH); char bufweb[MAX_PATH]; sprintf(bufweb,"%s%s",WEB_GETONEINFO,bbbb); m_web = bufweb; UpdateData(false); *pResult = 0; } ////////////////////////////////////////////////////////////////////////// //对好友田里面的东西分析 void CGETINFO::FX_TIAN(char *buf) { CString csbuf=buf; int nstatcount=10; //开始点 CString csa; //植物种类 CString csDj; //成熟等级 CString cstime; // ////////////////////////////////////////////////////////////////////////// for (int i=0;i<64;i++) { nstatcount = csbuf.Find("{",nstatcount); if (nstatcount==-1 || nstatcount== 0) break; if(FindQQstr(csbuf,"a",nstatcount,csa) ==0) break; FindQQstr(csbuf,"q",nstatcount,cstime); int type = atoi(csa); //得到他的类型 FindQQstr(csbuf,"b",nstatcount,csDj); //成熟等级 int csdj = atoi(csDj); ////////////////////////////////////////////////////////////////////////// char sztimeformat[64]; int dwtime=atoi(cstime); TimeFormat(dwtime,sztimeformat); jein_outinfo("%d:植物种类: %s 种植时间: %s 名字:%s %s",nstatcount,csa,sztimeformat,dongxi[type].name , jeinzt[csdj].ztname); nstatcount= csbuf.Find("}",nstatcount ); } } void CGETINFO::OnOneInfo() { int n =m_ctrl_list.GetNextItem(-1, LVIS_SELECTED); char bbbb[MAX_PATH]; m_ctrl_list.GetItemText(n,1,bbbb,MAX_PATH); char bufweb[MAX_PATH]; sprintf(bufweb,"%s%s",WEB_GETONEINFO,bbbb); m_web = bufweb; UpdateData(false); char *buf = new char[MAX_PACK]; if (buf) { jein_outinfo("准备得到:%s",bufweb); jein_gethtml(bufweb,buf,MAX_PACK-1); jein_outinfo("获取网页成功"); FX_TIAN(buf); delete buf; } } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //专用线程,刷新列表中的信息 UINT Tscaninfo(LPVOID lp) { CGETINFO *jein = (CGETINFO*)lp; if (jein==0) return 0; ////////////////////////////////////////////////////////////////////////// for (int i=0;i<jein->m_allnum;i++) //对所有好友分析 { //jein->m_ctrl_list.GetItemText(i,1,userid,64); //得到这个人的ID jein->FX_TIAN(i); //逐个分析 Sleep(50); } if(jein->m_allnum == 0) Sleep( 200 ); return 1; } //对列表好友线程检测 void CGETINFO::OnButton12() { ////////////////////////////////////////////////////////////////////////// // AfxBeginThread(Tscaninfo,this); } //从玩家数组中取出信息 void CGETINFO::FX_TIAN(int nid) { ////////////////////////////////////////////////////////////////////////// char bufweb[255]; //格式化的网页地址 sprintf(bufweb,"%s%d",WEB_GETONEINFO,friendinfo[nid].userId); char *buf = new char[MAX_PACK]; if (buf) { //jein_outinfo("好友ID:%d 准备得到:%s",friendinfo[nid].userId,bufweb); jein_gethtml(bufweb,buf,MAX_PACK-1); jein_outinfo("访问:%s " ,bufweb ); //得到信息成功.开始分析 } else { return; } ////////////////////////////////////////////////////////////////////////// CString csbuf=buf; int nstatcount=5; //开始点 CString csa; //植物种类 CString csDj; //成熟等级 CString cstime; // ////////////////////////////////////////////////////////////////////////// friendinfo[nid].ntiannum=0; //每个角色计数值物数 for (int i=0;i<64;i++) { nstatcount = csbuf.Find("{",nstatcount); if (nstatcount==-1 || nstatcount== 0) break; if(FindQQstr(csbuf,"a",nstatcount,csa) ==0) break; FindQQstr(csbuf,"q",nstatcount,cstime); int type = atoi(csa); //得到他的类型 if (type!=0) // { FindQQstr(csbuf,"b",nstatcount,csDj); //成熟等级 int csdj = atoi(csDj); friendinfo[nid].tian_info[friendinfo[nid].ntiannum].dj = csdj; //成熟等级 ////////////////////////////////////////////////////////////////////////// char sztimeformat[64]; int dwtime=atoi(cstime); TimeFormat(dwtime,sztimeformat); ////////////////////////////////////////////////////////////////////////// //复制植物名 strcpy(friendinfo[nid].tian_info[friendinfo[nid].ntiannum].szzhiwuname, dongxi[type].name);//名字 strcpy(friendinfo[nid].tian_info[friendinfo[nid].ntiannum].sztime, sztimeformat); //时间 //jeinzt[csdj].ztname由他的状态得到 friendinfo[nid].ntiannum++; //种下的东西++ } nstatcount= csbuf.Find("}",nstatcount ); } csbuf.Empty(); delete buf; } //读取玩家数组,将田地信息显示到列表中 void CGETINFO::AddInfoTian() { CString str; for (int i=0;i<m_allnum ;i ++ ) { for (int j=0;j<friendinfo[i].ntiannum;j++) //对他的田 { int nlist = m_ctrl_list.GetItemCount(); str.Format("%d",nlist); int dj = friendinfo[i].tian_info[j].dj; m_ctrl_list.InsertItem(nlist,str); //添加一行 m_ctrl_list.SetItemText(nlist,1, friendinfo[i].userName ); //角色名 m_ctrl_list.SetItemText(nlist,3, friendinfo[i].tian_info[j].szzhiwuname ); //植物名 m_ctrl_list.SetItemText(nlist,4, friendinfo[i].tian_info[j].sztime ); //植物名 //jeinzt[csdj].ztname由他的状态得到 m_ctrl_list.SetItemText(nlist,5, jeinzt[dj].ztname ); } } } void CGETINFO::OnButton3() { InitTab(); AddInfoTian(); } CString CGETINFO::GetZTname(int nDJ) //由状态等级返回其状态名 { return jeinzt[nDJ].ztname; }